/*
 * File Name：AlipayHelper.java
 * Copyright：Copyright 2008-2015 CiWong.Inc. All Rights Reserved.
 * Description： AlipayHelper.java
 * Modify By：res-dlzhou
 * Modify Date：2015年7月15日
 * Modify Type：Add
 */
package com.ciwong.mobilepay.alipay;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.widget.Toast;

import com.alipay.sdk.app.PayTask;
import com.ciwong.libs.utils.CWLog;
import com.ciwong.mobilelib.application.BaseApplication;
import com.ciwong.mobilepay.bean.OrderInfo;
import com.ciwong.mobilepay.bean.PayDetail;

/**
 * 支付宝助手
 * 
 * @author res-dlzhou
 * @version ciwong v.1.0 2015年7月15日
 * @since ciwong v.1.0
 */
public class AlipayHelper extends Handler
{
    /** 用于初始化相关 */
    private Activity mActivity;

    /** 支付回调监听 */
    private AlipayListener mListener;

    /** 支付标示 */
    private static final int SDK_PAY_FLAG = 1;

    /** 检测标示 */
    private static final int SDK_CHECK_FLAG = 2;

    public AlipayHelper(Activity activity, AlipayListener listener)
    {
        this.mActivity = activity;
        this.mListener = listener;
    }

    /**
     * 查询终端设备是否存在支付宝认证账户
     */
    public void checkAction()
    {
        new Thread(new AlipayCheckTask()).start();
    }

    // /**
    // * 支付动作
    // *
    // * @param orderInfo
    // * 订单信息
    // */
    // public void payAction(AlipayOrderInfo orderInfo)
    // {
    // // 订单
    // String orderInfoStr = getOrderInfo(orderInfo);
    //
    // // 对订单做RSA 签名
    // String sign = sign(orderInfoStr);
    //
    // // 完整的符合支付宝参数规范的订单信息
    // final String payInfo = orderInfoStr + "&sign=\"" + sign + "\"&"
    // + getSignType();
    //
    // // 异步调用支付宝进行支付
    // new AlipayTask().execute(payInfo);
    // }

    /**
     * 支付动作
     * 
     * @param orderInfoStr
     *            订单
     * @param sign
     *            订单RSA 签名
     */
    public void payAction(String orderInfoStr, String sign)
    {
        // 完整的符合支付宝参数规范的订单信息
        final String payInfo = orderInfoStr + "&sign=\"" + sign + "\"&"
                + getSignType();

        CWLog.d("PayRequest", "最终请求支付宝参数:" + payInfo);
        // 异步调用支付宝进行支付
        new AlipayTask().execute(payInfo);
    }

    @Override
    public void handleMessage(Message msg)
    {
        if (mListener == null)
        {
            return;
        }
        switch (msg.what)
        {
            case SDK_PAY_FLAG:
            {
                break;
            }
            case SDK_CHECK_FLAG:
            {
                Toast.makeText(mActivity, "检查结果为：" + msg.obj,
                        Toast.LENGTH_SHORT).show();
                break;
            }
            default:
                break;
        }
    }

    /**
     * 创建订单信息
     * 
     * @param info
     *            订单信息
     * @param payDetail
     *            支付详情
     * @param price
     *            商品金额
     * @return 订单表单
     */
    public String getOrderInfo(OrderInfo info, PayDetail payDetail, String price)
    {
        StringBuffer orderInfo = new StringBuffer();
        // 签约合作者身份ID
        orderInfo.append("partner=" + "\"" + info.getPartner() + "\"");
        // 签约卖家支付宝账号
        orderInfo.append("&seller_id=" + "\"" + info.getSelleremail() + "\"");
        // 商户网站唯一订单号
        orderInfo.append("&out_trade_no=" + "\"" + info.getRechargeNo() + "\"");
        // 商品名称
        orderInfo.append("&subject=" + "\"" + payDetail.getName() + "\"");
        // 商品详情
        orderInfo.append("&body=" + "\"" + payDetail.getName() + "\"");

        BaseApplication eApplication = BaseApplication.getInstance();
        String packageName = "";
        if (eApplication != null) {
            packageName = eApplication.getPackageName();
        }
        if ("com.ciwong.listenspeak".equals(packageName)) {
            // 回调订单参数
            orderInfo.append("&typeId=" + "\"" + 3 + "\"");
        } else {
            // 回调订单参数
            orderInfo.append("&typeId=" + "\"" + payDetail.getTypeId() + "\"");
        }
        // 商品金额
        orderInfo.append("&total_fee=" + "\"" + price + "\"");
        // 服务器异步通知页面路径
        orderInfo
                .append("&notify_url=" + "\"" + AlipayConfig.NOTIFY_URL + "\"");
        // 服务接口名称， 固定值
        orderInfo.append("&service=\"mobile.securitypay.pay\"");
        // 支付类型， 固定值
        orderInfo.append("&payment_type=\"1\"");
        // 参数编码， 固定值
        orderInfo.append("&_input_charset=\"utf-8\"");

        // 设置未付款交易的超时时间
        // 默认30分钟，一旦超时，该笔交易就会自动被关闭。
        // 取值范围：1m～15d。
        // m-分钟，h-小时，d-天，1c-当天（无论交易何时创建，都在0点关闭）。
        // 该参数数值不接受小数点，如1.5h，可转换为90m。
        orderInfo.append("&it_b_pay=\"30m\"");

        // extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付
        // orderInfo.append("&extern_token=" + "\"" + extern_token + "\"");

        // 支付宝处理完请求后，当前页面跳转到商户指定页面的路径，可空
        // orderInfo.append("&return_url=\"m.alipay.com\"");

        // 调用银行卡支付，需配置此参数，参与签名， 固定值 （需要签约《无线银行卡快捷支付》才能使用）
        // orderInfo.append("&paymethod=\"expressGateway\"");
        CWLog.e("debug", orderInfo.toString());
        return orderInfo.toString();
    }

    /**
     * 获取签名方式(RSA)
     */
    public String getSignType()
    {
        return "sign_type=\"RSA\"";
    }

    /**
     * 调用SDK支付任务
     */
    private class AlipayTask extends AsyncTask<String, Integer, String>
    {
        @Override
        protected String doInBackground(String... params)
        {
            // 完整的符合支付宝参数规范的订单信息
            String mPayInfo = params[0];
            // 构造PayTask 对象
            PayTask alipay = new PayTask(mActivity);
            // 调用支付接口，获取支付结果
            String result = alipay.pay(mPayInfo);
            return result;
        }

        @Override
        protected void onPostExecute(String result)
        {
            CWLog.d("PayRequest", "支付宝响应结果:" + result);
            if (mListener == null)
            {
                return;
            }
            PayResult payResult = new PayResult(result);
            // 支付宝返回此次支付结果及加签，建议对支付宝签名信息拿签约时支付宝提供的公钥做验签
            String resultInfo = payResult.getResult();
            // 结果状态
            String resultStatus = payResult.getResultStatus();
            // 判断resultStatus 为“9000”则代表支付成功，具体状态码代表含义可参考接口文档
            if (TextUtils.equals(resultStatus, AliPayErrCode.ALIPAY_SUCC))
            {
                mListener.onAliPaySucc(resultInfo);
            }
            // “8000”代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认，最终交易是否成功以服务端异步通知为准（小概率状态）
            else if (TextUtils.equals(resultStatus, AliPayErrCode.ALIPAY_ING))
            {
                mListener.onAliPaying("正在处理中..." + resultInfo);
            }
            else if (TextUtils.equals(resultStatus,
                    AliPayErrCode.ALIPAY_FAILURE))
            {
                mListener.onAliPayFailure("订单支付失败!" + resultInfo);
            }
            else if (TextUtils
                    .equals(resultStatus, AliPayErrCode.ALIPAY_CENCEL))
            {
                mListener.onAliPayFailure("您取消了支付!" + resultInfo);
            }
            else if (TextUtils.equals(resultStatus,
                    AliPayErrCode.ALIPAY_NET_ERR))
            {
                mListener.onAliPayErr(6002, "网络连接出错!" + resultInfo);
            }
            else
            {
                mListener.onAliPayFailure("其它出错原因!");
            }
        }
    }

    /**
     * 查询终端设备是否存在支付宝认证账户，任务
     */
    private class AlipayCheckTask implements Runnable
    {
        @Override
        public void run()
        {
            // 构造PayTask 对象
            PayTask payTask = new PayTask(mActivity);
            // 调用查询接口，获取查询结果
            boolean isExist = payTask.checkAccountIfExist();

            Message msg = new Message();
            msg.what = SDK_CHECK_FLAG;
            msg.obj = isExist;
            sendMessage(msg);
        }
    }

    /**
     * 支付宝客户端错误码
     */
    public static class AliPayErrCode
    {
        /**
         * 订单支付成功
         */
        public static final String ALIPAY_SUCC = "9000";

        /**
         * 正在处理中
         */
        public static final String ALIPAY_ING = "8000";

        /**
         * 订单支付失败
         */
        public static final String ALIPAY_FAILURE = "4000";

        /**
         * 用户中途取消
         */
        public static final String ALIPAY_CENCEL = "6001";

        /**
         * 网络连接出错
         */
        public static final String ALIPAY_NET_ERR = "6002";
    }

}
